package com.baimawangzi.recovery.util.dbutil;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

//通过反射构建实体类
public class BeanHandler<E> implements ResultHandler<E> {
    //某一个对象
    private Class<E> classType;
    //给对象classType进行赋值
    public BeanHandler(Class<E> classType){
        this.classType = classType;
    }




    @Override
    public List<E> handler(ResultSet rs) {
        try {
            //获取列数
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            ArrayList<E> list = new ArrayList<E>();
            //处理结果集---->遍历每一行数据
            while (rs.next()){
                //通过反射对象来创建具体的类对象
                //每循环一次，就创建一个对象，这个对象就封装这一行的数据
                //newInstance ---> 创建对象的方法
                E e = classType.newInstance();
                for (int i = 1; i <= columnCount; i++) {
                    //获取列名
                    String columnName = metaData.getColumnName(i);
                    //通过列名获取对应的列值
                    Object value = rs.getObject(columnName);
                    //通过反射获取对象的属性对象Field类
                    Field field = classType.getDeclaredField(columnName);
                    //暴力访问私有属性
                    field.setAccessible(true);
                    //Field类对象设置属性值
                    field.set(e,value);
                }
                list.add(e);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
